/*
* MicroJIAC - A Lightweight Agent Framework
* This file is part of MicroJIAC MIDlet-Maven-Plugin.
*
* Copyright (c) 2007-2012 DAI-Labor, Technische Universität Berlin
*
* This library includes software developed at DAI-Labor, Technische
* Universität Berlin (http://www.dai-labor.de)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
/*
* $Id$
*/
package de.jiac.micro.util;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.maven.archiver.ManifestConfiguration;
import org.apache.maven.archiver.ManifestSection;
import org.apache.maven.archiver.MavenArchiveConfiguration;
import org.apache.maven.artifact.DependencyResolutionRequiredException;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.archiver.ArchiverException;
import org.codehaus.plexus.archiver.jar.JarArchiver;
import org.codehaus.plexus.archiver.jar.Manifest;
import org.codehaus.plexus.archiver.jar.ManifestException;
/**
*
* @author Marcel Patzlaff
* @version $Revision$
*/
public class ReducedArchiver {
private JarArchiver archiver;
private File archiveFile;
/**
* Return a pre-configured manifest
*
* @todo Add user attributes list and user groups list
*/
public Manifest getManifest(MavenProject project, ManifestConfiguration config) throws ManifestException, DependencyResolutionRequiredException {
// Added basic entries
Manifest m = new Manifest();
Manifest.Attribute buildAttr = new Manifest.Attribute("Built-By", System.getProperty("user.name"));
m.addConfiguredAttribute(buildAttr);
Manifest.Attribute createdAttr = new Manifest.Attribute("Created-By", "Apache Maven");
m.addConfiguredAttribute(createdAttr);
if (config.getPackageName() != null) {
Manifest.Attribute packageAttr = new Manifest.Attribute("Package", config.getPackageName());
m.addConfiguredAttribute(packageAttr);
}
Manifest.Attribute buildJdkAttr = new Manifest.Attribute("Build-Jdk", System.getProperty("java.version"));
m.addConfiguredAttribute(buildJdkAttr);
if (config.isAddClasspath()) {
StringBuffer classpath = new StringBuffer();
List artifacts = project.getRuntimeClasspathElements();
String classpathPrefix = config.getClasspathPrefix();
for (Iterator iter = artifacts.iterator(); iter.hasNext();) {
File f = new File((String) iter.next());
if (f.isFile()) {
if (classpath.length() > 0) {
classpath.append(" ");
}
classpath.append(classpathPrefix);
classpath.append(f.getName());
}
}
if (classpath.length() > 0) {
Manifest.Attribute classpathAttr = new Manifest.Attribute("Class-Path", classpath.toString());
m.addConfiguredAttribute(classpathAttr);
}
}
String mainClass = config.getMainClass();
if (mainClass != null && !"".equals(mainClass)) {
Manifest.Attribute mainClassAttr = new Manifest.Attribute("Main-Class", mainClass);
m.addConfiguredAttribute(mainClassAttr);
}
return m;
}
public JarArchiver getArchiver() {
return archiver;
}
public void setArchiver(JarArchiver archiver) {
this.archiver = archiver;
}
public void setOutputFile(File outputFile) {
archiveFile = outputFile;
}
public void createArchive(MavenProject project, MavenArchiveConfiguration archiveConfiguration) throws ArchiverException, ManifestException, IOException,
DependencyResolutionRequiredException {
// ----------------------------------------------------------------------
// We want to add the metadata for the project to the JAR in two forms:
//
// The first form is that of the POM itself. Applications that wish to
// access the POM for an artifact using maven tools they can.
//
// The second form is that of a properties file containing the basic
// top-level POM elements so that applications that wish to access
// POM information without the use of maven tools can do so.
// ----------------------------------------------------------------------
// we have to clone the project instance so we can write out the pom with the deployment version,
// without impacting the main project instance...
MavenProject workingProject = new MavenProject(project);
if (workingProject.getArtifact().isSnapshot()) {
workingProject.setVersion(workingProject.getArtifact().getVersion());
}
// ----------------------------------------------------------------------
// Create the manifest
// ----------------------------------------------------------------------
File manifestFile = archiveConfiguration.getManifestFile();
if (manifestFile != null) {
archiver.setManifest(manifestFile);
}
Manifest manifest = getManifest(workingProject, archiveConfiguration.getManifest());
// any custom manifest entries in the archive configuration manifest?
if (!archiveConfiguration.isManifestEntriesEmpty()) {
Map entries = archiveConfiguration.getManifestEntries();
Set entrySet= entries.entrySet();
for (Iterator iter = entrySet.iterator(); iter.hasNext();) {
Map.Entry entry= (Map.Entry) iter.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
Manifest.Attribute attr = new Manifest.Attribute(key, value);
manifest.addConfiguredAttribute(attr);
}
}
// any custom manifest sections in the archive configuration manifest?
if (!archiveConfiguration.isManifestSectionsEmpty()) {
List sections = archiveConfiguration.getManifestSections();
for (Iterator iter = sections.iterator(); iter.hasNext();) {
ManifestSection section = (ManifestSection) iter.next();
Manifest.Section theSection = new Manifest.Section();
theSection.setName(section.getName());
if (!section.isManifestEntriesEmpty()) {
Map entries = section.getManifestEntries();
Set keys = entries.keySet();
for (Iterator it = keys.iterator(); it.hasNext();) {
String key = (String) it.next();
String value = (String) entries.get(key);
Manifest.Attribute attr = new Manifest.Attribute(key, value);
theSection.addConfiguredAttribute(attr);
}
}
manifest.addConfiguredSection(theSection);
}
}
// Configure the jar
archiver.addConfiguredManifest(manifest);
archiver.setCompress(archiveConfiguration.isCompress());
archiver.setIndex(archiveConfiguration.isIndex());
archiver.setDestFile(archiveFile);
// create archive
archiver.createArchive();
}
}